package leetcode.year2021.month12;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

// 15. 三数之和
public class _03_5ThreeSum15 {
  /**
   * 1、遍历每个数，如果当前数等于前一个数，则直接跳过（为了不重复）
   * 2、左右指针内缩进找目标值，如果找到符合条件的，则需要把值相等的用while遍历掉，防止重复结果
   * @param nums
   * @return
   */
  public List<List<Integer>> threeSum(int[] nums) {
    Arrays.sort(nums);
    int length = nums.length;
    List<List<Integer>> result = new ArrayList<>();
    if (nums.length < 3 || nums[0] > 0 || nums[length-1] < 0){
      return result;
    }

    for (int i = 0; i < length; i++) {
      if (nums[i] > 0){
        return result;
      }

      if (i > 0 && nums[i] == nums[i-1]) continue;

      int L = i+1;
      int R = length-1;

      while (L < R && nums[R] >= 0){
        int sum = nums[i] + nums[L] + nums[R];
        if (sum == 0){
          while (L < R && nums[L] == nums[L+1]) L++;
          while (L < R && nums[R] == nums[R-1]) R--;
          result.add(Arrays.asList(nums[i],nums[L],nums[R]));
          L++;
          R--;
        } else if (sum > 0){
          R--;
        } else {
          L++;
        }
      }
    }
    return result;
  }
  /**
   * 15. 三数之和
   * 给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。
   *
   * 注意：答案中不可以包含重复的三元组。
   *
   *
   *
   * 示例 1：
   *
   * 输入：nums = [-1,0,1,2,-1,-4]
   * 输出：[[-1,-1,2],[-1,0,1]]
   * 示例 2：
   *
   * 输入：nums = []
   * 输出：[]
   * 示例 3：
   *
   * 输入：nums = [0]
   * 输出：[]
   *
   *
   * 提示：
   *
   * 0 <= nums.length <= 3000
   * -105 <= nums[i] <= 105
   */
}
